<?php

namespace app\logic\push;

use xmpush\Sender;
use xmpush\Builder;
use xmpush\Constants;
use xmpush\TargetedMessage;
use xmpush\IOSBuilder;

vendor('MiPush.php.sdk.autoload');

/**
 * @version 1.0 对象存储相关逻辑类
 * @internal
 * @link
 * @property
 * @see
 * @since
 * @uses
 *
 */
class MiPush
{
    private $__config;

    public function __construct(array $arr_config)
    {
        $this->__config = $arr_config;
    }

    /**
     * @param $arr_alias_list
     * @param $title
     * @param $desc
     * @param $json_params
     * @param $str_type
     * @param int $int_long_time_to_send
     * @return mixed
     */
    public function android($arr_alias_list, $title, $desc, $json_params, $str_type, $int_long_time_to_live, $int_long_time_to_send)
    {
        $secret = $this->__config['android_secret'];
        $package = $this->__config['android_package'];

        // 常量设置必须在new Sender()方法之前调用
        Constants::setPackage($package);
        Constants::setSecret($secret);

        $sender = new Sender();

        // message1 演示自定义的点击行为
        $message = new Builder();

        $message->payload($json_params); // 设置要发送的消息内容payload，不允许全是空白字符，长度小于4K，中英文均以一个计算。

        $message->title($title);  // 设置在通知栏展示的通知的标题，不允许全是空白字符，长度小于16，中英文均以一个计算。

        $message->description($desc); // 设置在通知栏展示的通知的描述，不允许全是空白字符，长度小于128，中英文均以一个计算。

        $message->passThrough(0);  // 这是一条通知栏消息，如果需要透传，把这个参数设置成1,同时去掉title和descption两个参数

        /**
         * 设置通知类型，type的值可以是DEFAULT_ALL或者以下其他几种的OR组合：
         * DEFAULT_ALL = -1;
         * DEFAULT_SOUND  = 1;   // 使用默认提示音提示
         * DEFAULT_VIBRATE = 2;   // 使用默认震动提示
         * DEFAULT_LIGHTS = 4;    // 使用默认led灯光提示
         */
        $message->notifyType(-1);

        // $message->restrictedPackageName(String packageName); // 设置app的包名packageName。packageName必须和开发者网站上申请的结果一致。

        /**
         * 设置app的多包名packageNames（多包名发送广播消息）。
         * packageNames必须和开发者网站上申请的结果一致。
         * 可以为空，为空则默认给所有渠道包名推送。
         * 备注：不能同时调用restrictedPackageName方法和restrictedPackageNames方法。
         */
        // $message->restrictedPackageNames(String[] packageNames)

        $message->timeToLive($int_long_time_to_live); // 可选项。如果用户离线，设置消息在服务器保存的时间，单位：ms。服务器默认最长保留两周。

        $message->timeToSend($int_long_time_to_send); // 可选项。定时发送消息。timeToSend是以毫秒为单位的时间戳。注：仅支持七天内的定时消息。

        //$message->extra(Builder::notifyForeground, 1); // 应用在前台是否展示通知，如果不希望应用在前台时候弹出通知，则设置这个参数为0

        /**
         * 通知类型。最多支持0-4 5个取值范围，同样的类型的通知会互相覆盖，不同类型可以在通知栏并存
         * 可选项。默认情况下，通知栏只显示一条推送消息。
         * 如果通知栏要显示多条推送消息，需要针对不同的消息设置不同的notify_id（相同notify_id的通知栏消息会覆盖之前的）。
         */
        $message->notifyId(2);

        // $message->enableFlowControl(''); // 可选项。控制消息是否需要进行平缓发送（qps less 3000/second）。默认不支持。

        /**
         *可选项，对app提供一些扩展的功能，请参考2.2。
         * 除了这些扩展功能，开发者还可以定义一些key和value来控制客户端的行为。
         * 注：key和value的字符数不能超过1024，至多可以设置10个key-value键值对。
         */
        $message->extra('payload', $json_params);

        $message->build();

        if ($str_type == 'single') {
            $targetMessage = new TargetedMessage();

            $targetMessage->setTarget('alias1', TargetedMessage::TARGET_TYPE_ALIAS); // 设置发送目标。可通过regID,alias和topic三种方式发送
            $targetMessage->setMessage($message);

            return $sender->sendToAliases($message, $arr_alias_list)->getRaw();
        } else if ($str_type == 'all') {
            return $sender->broadcastAll($message, 30)->getRaw();
        }
    }

    /**
     * @param $arr_alias_list
     * @param $desc
     * @param $payload
     * @param $str_type
     * @param int $int_long_time_to_send
     * @return mixed
     */
    public function ios($arr_alias_list, $desc, $json_params, $str_type, $int_long_time_to_live, $int_long_time_to_send)
    {
        $secret = $this->__config['ios_secret'];
        $bundleId = $this->__config['ios_package'];

        //Constants::useOfficial(); //使用正式环境

        Constants::useSandbox(); //使用开发环境

        Constants::setBundleId($bundleId);
        Constants::setSecret($secret);

        $message = new IOSBuilder(); // 建立IOSBuilder对象，用来构造消息。APNs消息体为256个字符。

        $message->description($desc); // 设置在通知栏展示的通知的描述。

        $message->timeToLive($int_long_time_to_live); // 可选项。如果用户离线，设置消息在服务器保存的时间，单位：ms。服务器默认最长保留两周。

        $message->timeToSend($int_long_time_to_send); // 可选项。定时发送消息。timeToSend是用自1970年1月1日以来00:00:00.0 UTC时间表示（以毫秒为单位的时间）。注：仅支持七天内的定时消息。

        // $message->soundUrl('default'); // 可选项，自定义消息铃声。

        $message->badge(1); // 可选项，自定义通知数字角标。

        // $message->category(String category) // 可选项，iOS8推送消息快速回复类别。

        $message->extra('payload', $json_params); // 可选项，自定义键值对。控制客户端的行为。注：至多可以设置10个key-value键值对。

        $message->build();

        $sender = new Sender();

        if ($str_type == 'single') {
            return $sender->sendToAliases($message, $arr_alias_list)->getRaw();
        } else if ($str_type == 'all') {
            return $sender->broadcastAll($message, 30)->getRaw();
        }
    }

    /**
     * 安卓透传(只针对个人)
     * @param $arr_alias_list
     * @param $json_params
     * @return mixed
     */
    public function androidPassThrough($arr_alias_list, $json_params)
    {
        $secret = $this->__config['android_secret'];
        $package = $this->__config['android_package'];

        // 常量设置必须在new Sender()方法之前调用
        Constants::setPackage($package);
        Constants::setSecret($secret);

        $sender = new Sender();

        // message1 演示自定义的点击行为
        $message = new Builder();

        $message->payload($json_params); // 设置要发送的消息内容payload，不允许全是空白字符，长度小于4K，中英文均以一个计算。

        $message->passThrough(1);  // 这是一条通知栏消息，如果需要透传，把这个参数设置成1,同时去掉title和descption两个参数

        /**
         * 设置通知类型，type的值可以是DEFAULT_ALL或者以下其他几种的OR组合：
         * DEFAULT_ALL = -1;
         * DEFAULT_SOUND  = 1;   // 使用默认提示音提示
         * DEFAULT_VIBRATE = 2;   // 使用默认震动提示
         * DEFAULT_LIGHTS = 4;    // 使用默认led灯光提示
         */
        $message->notifyType(-1);

        // $message->restrictedPackageName(String packageName); // 设置app的包名packageName。packageName必须和开发者网站上申请的结果一致。

        /**
         * 设置app的多包名packageNames（多包名发送广播消息）。
         * packageNames必须和开发者网站上申请的结果一致。
         * 可以为空，为空则默认给所有渠道包名推送。
         * 备注：不能同时调用restrictedPackageName方法和restrictedPackageNames方法。
         */
        // $message->restrictedPackageNames(String[] packageNames)


        //$message->timeToLive($int_long_time_to_send); // 可选项。如果用户离线，设置消息在服务器保存的时间，单位：ms。服务器默认最长保留两周。

        // $message->timeToSend(0); // 可选项。定时发送消息。timeToSend是以毫秒为单位的时间戳。注：仅支持七天内的定时消息。

        //$message->extra(Builder::notifyForeground, 1); // 应用在前台是否展示通知，如果不希望应用在前台时候弹出通知，则设置这个参数为0

        /**
         * 通知类型。最多支持0-4 5个取值范围，同样的类型的通知会互相覆盖，不同类型可以在通知栏并存
         * 可选项。默认情况下，通知栏只显示一条推送消息。
         * 如果通知栏要显示多条推送消息，需要针对不同的消息设置不同的notify_id（相同notify_id的通知栏消息会覆盖之前的）。
         */
        $message->notifyId(2);

        // $message->enableFlowControl(''); // 可选项。控制消息是否需要进行平缓发送（qps less 3000/second）。默认不支持。

        /**
         *可选项，对app提供一些扩展的功能，请参考2.2。
         * 除了这些扩展功能，开发者还可以定义一些key和value来控制客户端的行为。
         * 注：key和value的字符数不能超过1024，至多可以设置10个key-value键值对。
         */
        $message->extra('payload', $json_params);

        $message->build();

        $targetMessage = new TargetedMessage();

        $targetMessage->setTarget('alias1', TargetedMessage::TARGET_TYPE_ALIAS); // 设置发送目标。可通过regID,alias和topic三种方式发送
        $targetMessage->setMessage($message);

        return $sender->sendToAliases($message, $arr_alias_list)->getRaw();
    }

    /**
     * ios透传(只针对个人)
     * @param $arr_alias_list
     * @param $json_params
     * @return mixed
     */
    public function iosPassThrough($arr_alias_list, $json_params, $str_desc)
    {
        return $this->ios($arr_alias_list, $str_desc, $json_params, 'single', 0, 0);
    }
}
